babl: replace trc lut inverter with binary search
authorØyvind Kolås <pippin@gimp.org>
Tue, 12 Sep 2017 20:33:15 +0000 (22:33 +0200)
committerØyvind Kolås <pippin@gimp.org>
Tue, 12 Sep 2017 20:46:02 +0000 (22:46 +0200)
Much faster and much more accurate.

babl/babl-trc.c

index 1a98889bfa5a189df0e3092735dc7db3e6639e81..ad40384bc1017dbc67ed7b5e757edeccc06f37b3 100644 (file)
@@ -598,21 +598,24 @@ babl_trc_new (const char *name,
 
     for (j = 0; j < n_lut; j++)
     {
-      float k;
-      float best_guess = 1.0;
-      float best_diff = 1.0;
-      for (k = 0.0; k <= 1.0; k+=0.0001) /* XXX: a binary search would be faster */
+      int k;
+      double min = 0.0;
+      double max = 1.0;
+      for (k = 0; k < 16; k++)
       {
-         float guess = babl_trc_lut_to_linear (BABL(&trc_db[i]), k);
-         float diff = fabs (guess - (j / (n_lut-1.0)));
-         if (diff < best_diff)
-         {
-            best_diff = diff;
-            best_guess = k;
-         }
+        double guess = (min + max) / 2;
+        float reversed_index = babl_trc_lut_to_linear (BABL(&trc_db[i]), guess) * (n_lut-1.0);
+
+        if (reversed_index < j)
+        {
+          min = guess;
+        }
+        else if (reversed_index > j)
+        {
+          max = guess;
+        }
       }
-
-      trc_db[i].inv_lut[j] = best_guess;
+      trc_db[i].inv_lut[j] = (min + max) / 2;
     }
   }